package com.ms.service.module.datacenterlite;

import java.io.Serializable;

import com.xpec.c4.game.utility.GUID;
import com.xpec.c4.service.module.BasicServiceModule;
import com.xpec.c4.service.module.ModuleServer;

public abstract class CentralAsyncCommand implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 3202566933894065422L;

	/**
	 * 有指定 key 的話會用 key 來分配到對應的 queue, 將執行的負擔分散
	 */
	public GUID key = null;
	
	/**
	 * 底層使用, callback的索引值
	 */
	protected long snCallback;
	
	/**
	 * 提出請求的Module ID
	 */
	protected String moduleID;
	
	/**
	 * 錯誤代碼
	 */
	protected int errorCode;
	
	/**
	 * 默認使用第0條 task Queue
	 */
	protected int queueID = 0;
	
	/**
	 * 回呼函式
	 */
	public String callbackMethod;
	
	/**
	 * 异步调用
	 */
	public abstract void asyncExecute() throws Exception;
	
	/**
	 * 回覆callback
	 */
	public abstract void callBackExecute(Object... userData) throws Exception;
	
	/**
	 * 目前所在的 module server
	 * <p>
	 * 這裡的值會在執行時期系統自動填入，自行在這邊填值的話會可能會在執行過程中被覆蓋掉。
	 */
	private String currentModuleServerId;
	
	public long getSnCallback() {
		return snCallback;
	}

	public void setSnCallback(long snCallback) {
		this.snCallback = snCallback;
	}

	public String getModuleID() {
		return moduleID;
	}

	public void setModuleID(String moduleID) {
		this.moduleID = moduleID;
	}

	public int getQueueID() {
		return queueID;
	}

	public void setQueueID(int queueID) {
		this.queueID = queueID;
	}

	public int getErrorCode() {
		return errorCode;
	}

	public void setErrorCode(int errorCode) {
		this.errorCode = errorCode;
	}

	/**
	 * 取得目前執行時期所在的 module
	 * @return
	 */
	public BasicServiceModule getCurrentModuleServer() {
		return ModuleServer.getInstance().getBasicServiceModule(currentModuleServerId);
	}

	public void setCurrentModuleServerId(String currentModuleServerId) {
		this.currentModuleServerId = currentModuleServerId;
	}
	
	
}
